package com.foreveross.util;

import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import android.util.Base64;

public class EncryptUtil {
	public static final String DES = "DES";
	public static final String DESede = "3DES";
	public static final String AES = "AES";

	/**
	 * 对输入的字符串进行加密,加密后的密文将再次进行BASE64加密后转换为字符串返回。
	 * 
	 * @param algorithm
	 *            加密类型，在DesEncrypt类中提供了三种类型的静态常量字符串--DES,DESede(3DES),AES
	 * @param password
	 *            密钥--DES密钥长度必须为8字节（64位） DESede(3DES)密钥长度可为16字节（128位）、24字节（192位）
	 *            AES密钥长度可为16字节（128位）、24字节（192位）、32字节（256位）
	 * @param src
	 *            需要加密的字符串
	 * @return String
	 */
	public static String encryption(String algorithm, String password, String src) throws Exception {
		if (!checkKey(password, algorithm)) {
			return null;
		}
		SecureRandom random = new SecureRandom();
		SecretKey secretKey = null;
		secretKey = new SecretKeySpec(password.getBytes(), algorithm);
		Cipher cipher = Cipher.getInstance(algorithm);
		cipher.init(Cipher.ENCRYPT_MODE, secretKey, random);
		byte[] result = cipher.doFinal(src.getBytes());
		return new String(Base64.encode(result, Base64.DEFAULT), "UTF-8");
	}

	/**
	 * 对Encryption加密方法加密过的字符串进行解密。
	 * 
	 * @param algorithm
	 *            解密类型，在DesEncrypt类中提供了三种类型的静态常量字符串--DES,DESede(3DES),AES
	 * @param password
	 *            密钥--DES密钥长度必须为8字节（64位） DESede(3DES)密钥长度可为16字节（128位）、24字节（192位）
	 *            AES密钥长度可为16字节（128位）、24字节（192位）、32字节（256位）
	 * @param src
	 *            需要解密的字符串
	 * @return String
	 */
	public static String decryption(String algorithm, String password, String src) throws Exception {
		if (!checkKey(password, algorithm)) {
			return null;
		}

		SecureRandom random = new SecureRandom();
		SecretKey secretKey = null;
		secretKey = new SecretKeySpec(password.getBytes(), algorithm);
		Cipher cipher = Cipher.getInstance(algorithm);
		cipher.init(Cipher.DECRYPT_MODE, secretKey, random);
		byte[] result = Base64.decode(src, Base64.DEFAULT);
		return new String(cipher.doFinal(result));
	}

	private static boolean checkKey(String keyText, String algorithm) {
		if (algorithm.equals(DESede)) {
			if (keyText != null && !"".equals(keyText.trim())) {
				if (keyText.length() == 24 || keyText.length() == 16) {
					return true;
				}
			}
		} else if (algorithm.equals(DES)) {
			if (keyText != null && !"".equals(keyText.trim())) {
				if (keyText.length() == 8) {
					return true;
				}
			}
		} else if (algorithm.equals(AES)) {
			if (keyText != null && !"".equals(keyText.trim())) {
				if (keyText.length() == 16 || keyText.length() == 24 || keyText.length() == 32) {
					return true;
				}
			}
		}
		return false;

	}
}